{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np \n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.dates as mdates\n",
    "import seaborn as sns\n",
    "from sklearn import preprocessing\n",
    "import time\n",
    "from datetime import datetime\n",
    "from tqdm.auto import trange, tqdm\n",
    "import os\n",
    "import math\n",
    "import datetime as dt\n",
    "from numpy import newaxis\n",
    "from keras.layers import Dense, Activation, Dropout, LSTM, GRU, SimpleRNN, BatchNormalization\n",
    "from keras.models import Sequential, load_model, Model\n",
    "from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard\n",
    "import matplotlib.pyplot as plt\n",
    "from keras.optimizers import SGD,Adam\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.preprocessing.sequence import TimeseriesGenerator\n",
    "from keras import backend as K\n",
    "from keras.losses import MeanSquaredLogarithmicError\n",
    "from keras import Input"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotTrainFigure(model, x_train, y_train, x_val, y_val, dates, trainDates, valDates, sc2, time_step=6, country='China', daily=False):\n",
    "    if daily:\n",
    "        title = 'New'\n",
    "    else:\n",
    "        title = 'Cumulative'\n",
    "    #--------------------------------------------------Train---------------------------------------------------------#\n",
    "    # Confirmed cases\n",
    "    pre_train_confirmed = []\n",
    "    truth_train_confirmed = []\n",
    "    # Fatalities\n",
    "    pre_train_fatalities = []\n",
    "    truth_train_fatalities = []\n",
    "\n",
    "    for i in range(len(x_train)):\n",
    "        testx = np.array([x_train[i]])\n",
    "        testy = np.array([y_train[i]])\n",
    "        #         testx, testy  = train_generator[i]\n",
    "\n",
    "        pre = model.predict(testx)\n",
    "\n",
    "        confirmed_pre = pre[0][0]\n",
    "        confirmed_truth = testy[0][0]\n",
    "        fatalities_pre = pre[0][1]\n",
    "        fatalities_truth = testy[0][1]\n",
    "\n",
    "        t1, t3 = tuple(sc2.inverse_transform([[confirmed_pre, fatalities_pre]])[0])\n",
    "        t2, t4 = tuple(sc2.inverse_transform([[confirmed_truth, fatalities_truth]])[0])\n",
    "        pre_train_confirmed.append(t1)\n",
    "        truth_train_confirmed.append(t2)\n",
    "        pre_train_fatalities.append(t3)\n",
    "        truth_train_fatalities.append(t4)\n",
    "#     trainDates = dataframe[time_step:time_step + len(x_train)].index.values\n",
    "    \n",
    "    #--------------------------------------------------Validation---------------------------------------------------------#\n",
    "    # Confirmed cases\n",
    "    pre_val_confirmed = []\n",
    "    truth_val_confirmed = []\n",
    "    # Fatalities\n",
    "    pre_val_fatalities = []\n",
    "    truth_val_fatalities = []\n",
    "\n",
    "    for i in range(len(x_val)):\n",
    "        testx = np.array([x_val[i]])\n",
    "        testy = np.array([y_val[i]])\n",
    "\n",
    "        pre = model.predict(testx)\n",
    "\n",
    "        confirmed_pre = pre[0][0]\n",
    "        confirmed_truth = testy[0][0]\n",
    "        fatalities_pre = pre[0][1]\n",
    "        fatalities_truth = testy[0][1]\n",
    "\n",
    "        t1, t3 = tuple(sc2.inverse_transform([[confirmed_pre, fatalities_pre]])[0])\n",
    "        t2, t4 = tuple(sc2.inverse_transform([[confirmed_truth, fatalities_truth]])[0])\n",
    "        pre_val_confirmed.append(t1)\n",
    "        truth_val_confirmed.append(t2)\n",
    "        pre_val_fatalities.append(t3)\n",
    "        truth_val_fatalities.append(t4)\n",
    "#     valDates = dataframe[time_step + len(x_train):].index.values\n",
    "    \n",
    "#     dates = dataframe.index.values\n",
    "    #--------------------------------------------------Plot---------------------------------------------------------#\n",
    "    dates  = date_remove_year(dates)\n",
    "    trainDates  = date_remove_year(trainDates)\n",
    "    valDates  = date_remove_year(valDates)\n",
    "#     dates = dateStrs_to_dateframe(dates)\n",
    "#     trainDates  = dateStrs_to_dateframe(trainDates)\n",
    "#     valDates  = dateStrs_to_dateframe(valDates)\n",
    "    \n",
    "    print(len(trainDates), len(pre_train_confirmed), len(truth_train_confirmed))\n",
    "    print(len(valDates), len(pre_val_confirmed), len(truth_val_confirmed))\n",
    "    \n",
    "    Confirmed = pd.DataFrame({'Date': trainDates, 'Prediction': pre_train_confirmed, 'Real cases': truth_train_confirmed})\n",
    "    Confirmed.set_index(['Date'], inplace=True)\n",
    "\n",
    "    Fatalities = pd.DataFrame({'Date': trainDates, 'Prediction': pre_train_fatalities, 'Real cases': truth_train_fatalities})\n",
    "    Fatalities.set_index(['Date'], inplace=True)\n",
    "\n",
    "    Confirmed['Prediction'] = Confirmed['Prediction'].astype(int)\n",
    "    Confirmed['Real cases'] = Confirmed['Real cases'].astype(int)\n",
    "    Fatalities['Prediction'] = Fatalities['Prediction'].astype(int)\n",
    "    Fatalities['Real cases'] = Fatalities['Real cases'].astype(int)\n",
    "\n",
    "    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(50, 10))\n",
    "#     Confirmed.plot(ax=ax1)\n",
    "    ax1.plot(trainDates, pre_train_confirmed, 'o--', color='violet')\n",
    "    ax1.plot(trainDates, truth_train_confirmed, 'o--', color='coral')\n",
    "    ax1.plot(valDates, pre_val_confirmed, 'o--', color='blue')  \n",
    "    ax1.plot(valDates, truth_val_confirmed, 'o--', color='green')\n",
    "    ax1.legend(['Predicted cases in train and val set', 'Real cases in train and val set', \n",
    "                'Predicted cases in test set', 'Real cases in test set'], loc='upper left')\n",
    "    ax1.set_xticklabels(dates, rotation=45)\n",
    "#     ax1.set_xticks(range(0,len(dates), 5))\n",
    "#     ax1.set_xticklabels([dates[i] for i in range(len(dates)) if i % 5==0])  \n",
    "# or\n",
    "#     ax1.xaxis.set_major_locator(mdates.DayLocator(interval=6))\n",
    "#     ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))\n",
    "#     \n",
    "    ax1.set_title(country + \" \" + title+ \" confirmed cases \", size=13)\n",
    "    ax1.set_ylabel(\"Number of cases\", size=13)\n",
    "    ax1.set_xlabel(\"Date\", size=13)\n",
    "\n",
    "#     Fatalities.plot(ax=ax2)\n",
    "    ax2.plot(trainDates, pre_train_fatalities, 'o--', color='violet')\n",
    "    ax2.plot(trainDates, truth_train_fatalities, 'o--', color='coral')\n",
    "    ax2.plot(valDates, pre_val_fatalities, 'o--', color='blue')  \n",
    "    ax2.plot(valDates, truth_val_fatalities, 'o--', color='green')\n",
    "    ax2.legend(['Predicted fatalities in train and val set', 'Real fatalities in train and val set', \n",
    "                'Predicted fatalities in test set', 'Real fatalities in test set'], loc='upper left')\n",
    "    ax2.set_xticklabels(dates, rotation=45)\n",
    "\n",
    "    ax2.set_title(country + \" \" + title+  \" Fatalities \", size=13)\n",
    "    ax2.set_ylabel(\"Number of cases\", size=13)\n",
    "    ax2.set_xlabel(\"Date\", size=13)\n",
    "    fig.savefig(country+title+'Result.png')\n",
    "    return Confirmed.copy(), Fatalities.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Confirmed_train, Fatalities_train = plotTrainFigure(model, X_trainAndVal, Y_trainAndVal, X_test, Y_test, \n",
    "#                                                     dates, trainAndValDates, testDates, scb, time_step=time_step, country=country)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [],
   "source": [
    "def datelist(beginDate, endDate):\n",
    "    # beginDate, endDate are something like ‘20160601’\n",
    "    date_l=[datetime.strftime(x,'%Y-%m-%d') for x in list(pd.date_range(start=beginDate, end=endDate))]\n",
    "    return date_l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [],
   "source": [
    "def date_remove_year(dates):\n",
    "    return [datetime.strftime(datetime.strptime(x, '%Y-%m-%d'),'%m-%d') for x in dates]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [],
   "source": [
    "def dateStrs_to_dateframe(dates):\n",
    "    return [datetime.strptime(x, '%Y-%m-%d') for x in dates]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [],
   "source": [
    "def printFigure(history):\n",
    "    plt.plot(history.history['loss'])\n",
    "    plt.plot(history.history['val_loss'])\n",
    "    plt.title('Loss over epochs')\n",
    "    plt.ylabel('Loss')\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.legend(['Train', 'Validation'], loc='best')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [],
   "source": [
    "def MaxMinNormalization(data, feature_range=(0,1), split=0.8):\n",
    "    sc = MinMaxScaler(feature_range=feature_range)\n",
    "    scaled_data = sc.fit_transform(data.reshape(-1, 1)) if len(data.shape)==1 else sc.fit_transform(data)\n",
    "#     scaled_data = data\n",
    "    scaled_train = scaled_data[:int(len(scaled_data) * split)]\n",
    "    scaled_val = scaled_data[int(len(scaled_data) * split):]\n",
    "    return scaled_train, scaled_val, sc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [],
   "source": [
    "def MaxMinNormalization2(data):\n",
    "    sc = MinMaxScaler(feature_range=(0,1))\n",
    "    scaled_data = sc.fit_transform(data.reshape(-1, 1)) if len(data.shape)==1 else sc.fit_transform(data)\n",
    "    return scaled_data, sc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [],
   "source": [
    "rootPath = 'D:/Dropbox/Project/code/Python/COVID19-Global-Forecasting/data/'\n",
    "trainFileName = 'train.csv'\n",
    "testFileName = 'test.csv'\n",
    "trainWithFlightFileName = 'train_flight.csv'\n",
    "enrichedDataFileName = 'enriched_covid_19_week_2.csv'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loadDataByCountry(Country, data_all=None, dateRange= ('2020-01-22','2020-04-13'), is_startFromFirstCaseDay=False, daily=False):\n",
    "    confirmed_total_date = data_all[data_all['Country_Region']==Country].groupby(['Date']).agg({'ConfirmedCases':['sum']})\n",
    "    flight_total_date = data_all[data_all['Country_Region']==Country].groupby(['Date']).agg({'DepartureFlight':['mean']})\n",
    "    data = data_all[data_all['Country_Region']==Country].groupby(['Date']).agg({'ConfirmedCases':['sum'],\n",
    "                                                                                'Fatalities':['sum'],\n",
    "                                                                                'DepartureFlight':['mean'],\n",
    "                                                                                'hospibed':['mean'],\n",
    "                                                                                'lung':['mean'],\n",
    "                                                                                'total_pop':['mean'],\n",
    "                                                                                'density':['mean'],\n",
    "                                                                                'age_100+':['mean']})\n",
    "    day = flight_total_date.shape[0]\n",
    "#     for i in tqdm(range(day), desc='Complete zero-value in flight data'):\n",
    "#         if flight_total_date.iloc[i].values[0]==0:\n",
    "#             flight_total_date.iloc[i] = int((flight_total_date.iloc[i-1]+flight_total_date.iloc[i+1])/2)\n",
    "    \n",
    "    is_FirstCase = False\n",
    "    FirstCaseDate = dateRange[0]\n",
    "    for i in tqdm(range(day), desc='Complete zero-value in data'):\n",
    "        Date = data.iloc[i].name\n",
    "        if not is_FirstCase:\n",
    "            if data.iloc[i].values[1]!=0:\n",
    "                print('For ', Country, 'The first case during the period just has been found', Date)\n",
    "                FirstCaseDate = Date\n",
    "                is_FirstCase = True\n",
    "            \n",
    "        if data.iloc[i].values[2]==0:\n",
    "            data.loc[Date,'DepartureFlight'] = int((data.iloc[i-1]['DepartureFlight']+data.iloc[i+1]['DepartureFlight'])/2)\n",
    "    \n",
    "    if daily:\n",
    "        data_ConfirmedCases = data.ConfirmedCases.diff()\n",
    "        data_Fatalities = data.Fatalities.diff()\n",
    "        \n",
    "        if not is_startFromFirstCaseDay:\n",
    "            data.ConfirmedCases = data_ConfirmedCases\n",
    "            data.Fatalities = data_Fatalities\n",
    "            return data.iloc[1:].loc[dateRange[0]: dateRange[1]]\n",
    "        else:\n",
    "            data.ConfirmedCases = data_ConfirmedCases\n",
    "            data.Fatalities = data_Fatalities\n",
    "            return data.iloc[1:].loc[FirstCaseDate: dateRange[1]]\n",
    "    \n",
    "    if not is_startFromFirstCaseDay:   \n",
    "        return data.loc[dateRange[0]: dateRange[1]]\n",
    "    else:\n",
    "        return data.loc[FirstCaseDate: dateRange[1]]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [],
   "source": [
    "# dateRange= ('2020-01-22','2020-04-13')\n",
    "# data.iloc[1:].loc[dateRange[0]: dateRange[1]]\n",
    "# loadDataByCountry(Country = 'China', data_all=rich_data, is_startFromFirstCaseDay=True, daily=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_extra_data(extra_data_df=None):\n",
    "    extra_data_df[\"Country_Region\"] = [country_name.replace(\"'\",\"\") if country_name.find('_')<0 else country_name[:country_name.find('_')].replace(\"'\",\"\") for country_name in extra_data_df[\"Country_Region\"]]\n",
    "\n",
    "#     extra_data_df[\"restrictions\"] = extra_data_df[\"restrictions\"].astype(\"int\")\n",
    "#     extra_data_df[\"quarantine\"] = extra_data_df[\"quarantine\"].astype(\"int\")\n",
    "#     extra_data_df[\"schools\"] = extra_data_df[\"schools\"].astype(\"int\")\n",
    "    extra_data_df[\"total_pop\"] = extra_data_df[\"total_pop\"].astype(\"float\")\n",
    "    extra_data_df[\"density\"] = extra_data_df[\"density\"].astype(\"float\")\n",
    "    extra_data_df[\"hospibed\"] = extra_data_df[\"hospibed\"].astype(\"float\")\n",
    "    extra_data_df[\"lung\"] = extra_data_df[\"lung\"].astype(\"float\")\n",
    "    extra_data_df[\"age_100+\"] = extra_data_df[\"age_100+\"].astype(\"float\")\n",
    "    \n",
    "    extra_data_df[\"total_pop\"] = extra_data_df[\"total_pop\"]/max(extra_data_df[\"total_pop\"])\n",
    "    extra_data_df[\"density\"] = extra_data_df[\"density\"]/max(extra_data_df[\"density\"])\n",
    "    extra_data_df[\"hospibed\"] = extra_data_df[\"hospibed\"]/max(extra_data_df[\"hospibed\"])\n",
    "    extra_data_df[\"lung\"] = extra_data_df[\"lung\"]/max(extra_data_df[\"lung\"])\n",
    "    extra_data_df[\"age_100+\"] = extra_data_df[\"age_100+\"]/max(extra_data_df[\"age_100+\"])\n",
    "\n",
    "    extra_data_df = extra_data_df[[\"Country_Region\",\"Date\",\"hospibed\",\"lung\",\"total_pop\",\"density\",\"age_100+\"]]\n",
    "    return extra_data_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "def merge_extra_data(extra_data_df=None, raw_data=None):\n",
    "    extra_data = load_extra_data(extra_data_df=extra_data_df)\n",
    "    raw_data[\"Country_Region\"] = [country_name.replace(\"'\",\"\") for country_name in raw_data[\"Country_Region\"]]\n",
    "    train_df = raw_data.merge(extra_data, how=\"left\", on=['Country_Region','Date']).drop_duplicates()\n",
    "    \n",
    "    for country_region in train_df.Country_Region.unique():\n",
    "        query_df = train_df.query(\"Country_Region=='\"+country_region+\"' and Date=='2020-03-25'\")\n",
    "        train_df.loc[(train_df[\"Country_Region\"]==country_region) & (train_df[\"Date\"]>\"2020-03-25\"),\"total_pop\"] = query_df.total_pop.values[0]\n",
    "        train_df.loc[(train_df[\"Country_Region\"]==country_region) & (train_df[\"Date\"]>\"2020-03-25\"),\"hospibed\"] = query_df.hospibed.values[0]\n",
    "        train_df.loc[(train_df[\"Country_Region\"]==country_region) & (train_df[\"Date\"]>\"2020-03-25\"),\"density\"] = query_df.density.values[0]\n",
    "        train_df.loc[(train_df[\"Country_Region\"]==country_region) & (train_df[\"Date\"]>\"2020-03-25\"),\"lung\"] = query_df.lung.values[0]\n",
    "        train_df.loc[(train_df[\"Country_Region\"]==country_region) & (train_df[\"Date\"]>\"2020-03-25\"),\"age_100+\"] = query_df[\"age_100+\"].values[0]\n",
    "    return train_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LSTM model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [],
   "source": [
    "def root_mean_squared_error(y_true, y_pred):\n",
    "    return K.sqrt(K.mean(K.square(K.log(y_pred) - K.log(y_true)), axis=-1)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [],
   "source": [
    "def aLSTM(time_step = 6, nfeatures=3):\n",
    "    inputs = Input(shape=(time_step,nfeatures))\n",
    "    lstm1 = LSTM(128, return_sequences = True, recurrent_dropout=0.5)(inputs)\n",
    "    \n",
    "    # Confiromed cases\n",
    "    lstmC = LSTM(64)(lstm1)\n",
    "    denseC1 = Dense(32, activation='relu')(lstmC)\n",
    "    dropC1 = Dropout(0.5)(denseC1)\n",
    "    denseC2 = Dense(2, activation='relu')(dropC1)\n",
    "    \n",
    "    # Fatalities\n",
    "#     lstmF = LSTM(32)(lstm1)\n",
    "#     denseF1 = Dense(128)(lstmF)\n",
    "#     dropF1 = Dropout(0.5)(denseF1)\n",
    "#     denseF2 = Dense(1, activation='relu')(dropF1)\n",
    "    \n",
    "    model = Model(inputs=inputs, outputs=denseC2)\n",
    "#     \n",
    "    model.compile(loss=MeanSquaredLogarithmicError(), optimizer='adam', metrics = ['accuracy'])\n",
    "    model.summary()\n",
    "    return model\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [],
   "source": [
    "# rich_data.Country_Region.unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [],
   "source": [
    "def multi_country(country, data_all, is_startFromFirstCaseDay, daily, length):\n",
    "    data = loadDataByCountry(Country = country, data_all=rich_data, is_startFromFirstCaseDay=True, daily=daily)\n",
    "    data_CandF = data.values[:,0:2]\n",
    "    # Consider all features\n",
    "    data_multi_features = data.values\n",
    "    scaled_data_b,scb = MaxMinNormalization2(data = data_CandF)\n",
    "    scaled_data_c, scc = MaxMinNormalization2(data = data_multi_features)\n",
    "    data_gen = TimeseriesGenerator(scaled_data_c,scaled_data_b, length =length , batch_size=1)\n",
    "    X_data = []\n",
    "    Y_data = []\n",
    "    for i in range(len(data_gen)):\n",
    "        X,Y= data_gen[i]\n",
    "        X_data.append(X[0])\n",
    "        Y_data.append(Y[0])\n",
    "    return X_data, Y_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_test = pd.read_csv(rootPath+testFileName)\n",
    "data_all = pd.read_csv(rootPath+trainWithFlightFileName)\n",
    "data_all.Province_State.fillna(\"None\", inplace=True)\n",
    "# data_all = data_all.drop(['Province_State'], axis=1)\n",
    "extra_data_df = pd.read_csv(rootPath+enrichedDataFileName)\n",
    "rich_data = merge_extra_data(extra_data_df=extra_data_df, raw_data=data_all)\n",
    "dayList =datelist ('20200122','20200413')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f0fe52c62573476e974a47e3108a95be",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  US The first case during the period just has been found 2020-03-10\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "709e12034b7e4060ac1759f8df0406de",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Canada The first case during the period just has been found 2020-03-09\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6784ede4ad6d401ca04eede0546a4e30",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  France The first case during the period just has been found 2020-02-15\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a7b095de227d4d2085f808d2e6221603",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Japan The first case during the period just has been found 2020-02-13\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "860a31aecf224393aacdfd9152f94bbf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Sweden The first case during the period just has been found 2020-03-11\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3aa43b61689248dc95b1fe622fbe153b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Germany The first case during the period just has been found 2020-03-09\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fe0182a1af80452fad7cf713f4c1aa75",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  South Africa The first case during the period just has been found 2020-03-27\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ff3ea8cd8b0c4fc3b445b7114644e504",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Australia The first case during the period just has been found 2020-03-01\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cf4f8afe6a9b48a9b6980185892ae01d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, description='Complete zero-value in data', max=83.0, style=ProgressSty…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For  Italy The first case during the period just has been found 2020-02-21\n",
      "\n"
     ]
    }
   ],
   "source": [
    "split = 0.6\n",
    "save_dir = \"saved_models\"\n",
    "save_fname = os.path.join(save_dir, 'COVID19_LSTM.h5')\n",
    "time_step = 6\n",
    "daily=True\n",
    "\n",
    "X_data = []\n",
    "Y_data = []\n",
    "\n",
    "is_single_country = False\n",
    "country = 'China'\n",
    "if is_single_country:\n",
    "    data = loadDataByCountry(Country = country, data_all=rich_data, is_startFromFirstCaseDay=True, daily=daily)\n",
    "    # Consider confiromed cases and Fatalities\n",
    "    data_CandF = data.values[:,0:2]\n",
    "    # Consider all features\n",
    "    data_multi_features = data.values\n",
    "\n",
    "    scaled_data_b,scb = MaxMinNormalization2(data = data_CandF)\n",
    "    scaled_data_c, scc = MaxMinNormalization2(data = data_multi_features)\n",
    "    data_gen = TimeseriesGenerator(scaled_data_c,scaled_data_b, length = time_step, batch_size=1)\n",
    "    for i in range(len(data_gen)):\n",
    "        X,Y= data_gen[i]\n",
    "        X_data.append(X[0])\n",
    "        Y_data.append(Y[0])\n",
    "else:\n",
    "    if not is_single_country:\n",
    "        countries = ['US',  'Canada','France','Japan','Sweden','Germany','South Africa','Australia','Italy']\n",
    "        for c in countries:\n",
    "            x, y = multi_country(country=c, data_all=rich_data, is_startFromFirstCaseDay=True, daily=daily, length=time_step)\n",
    "            X_data = X_data+x\n",
    "            Y_data = Y_data+y\n",
    "\n",
    "\n",
    "X_data = np.array(X_data)\n",
    "Y_data = np.array(Y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [],
   "source": [
    "# len(data_gen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_train = int(split*X_data.shape[0])\n",
    "num_test = num_val = int((1-split)/2*X_data.shape[0])\n",
    "# Split data set\n",
    "# Indiex\n",
    "indices = np.array(range(X_data.shape[0]))\n",
    "testI = indices[-num_test:]\n",
    "trainAndValI = np.setdiff1d(indices,testI)\n",
    "trainI = np.random.choice(X_data[trainAndValI].shape[0],size=num_train,replace=False)\n",
    "valI = np.setdiff1d(trainAndValI,trainI)\n",
    "# Data\n",
    "X_train = X_data[trainI]\n",
    "Y_train = Y_data[trainI]\n",
    "X_val = X_data[valI]\n",
    "Y_val = Y_data[valI]\n",
    "X_test = X_data[testI]\n",
    "Y_test = Y_data[testI]\n",
    "if is_single_country:\n",
    "    # Date\n",
    "    dates = data[time_step:].index.values\n",
    "    trainDates = dates[trainI]\n",
    "    valDates = dates[valI]\n",
    "    testDates = dates[testI]\n",
    "    trainAndValDates = dates[trainAndValI]\n",
    "    #\n",
    "    knownI = np.argsort(trainAndValDates)\n",
    "    trainAndValDates = trainAndValDates[knownI]\n",
    "    X_trainAndVal = X_data[knownI]\n",
    "    Y_trainAndVal = Y_data[knownI]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [],
   "source": [
    "epochs = 250\n",
    "batch_size = 8\n",
    "save_fname = os.path.join(save_dir, 'COVID19_LSTM.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_8\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_8 (InputLayer)         (None, 6, 8)              0         \n",
      "_________________________________________________________________\n",
      "lstm_13 (LSTM)               (None, 6, 128)            70144     \n",
      "_________________________________________________________________\n",
      "lstm_14 (LSTM)               (None, 64)                49408     \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 32)                2080      \n",
      "_________________________________________________________________\n",
      "dropout_8 (Dropout)          (None, 32)                0         \n",
      "_________________________________________________________________\n",
      "dense_16 (Dense)             (None, 2)                 66        \n",
      "=================================================================\n",
      "Total params: 121,698\n",
      "Trainable params: 121,698\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "[Model] Training Started\n",
      "[Model] 250 epochs, 8 batch size\n",
      "Train on 193 samples, validate on 65 samples\n",
      "Epoch 1/250\n",
      "1/1 [==============================] - 1s 792ms/step - loss: 0.1099 - accuracy: 0.6062 - val_loss: 0.1056 - val_accuracy: 0.4769\n",
      "Epoch 2/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.1059 - accuracy: 0.4974 - val_loss: 0.1013 - val_accuracy: 0.5077\n",
      "Epoch 3/250\n",
      "1/1 [==============================] - 0s 18ms/step - loss: 0.1008 - accuracy: 0.5181 - val_loss: 0.0925 - val_accuracy: 0.5077\n",
      "Epoch 4/250\n",
      "1/1 [==============================] - 0s 19ms/step - loss: 0.0931 - accuracy: 0.5544 - val_loss: 0.0830 - val_accuracy: 0.5077\n",
      "Epoch 5/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0837 - accuracy: 0.5285 - val_loss: 0.0726 - val_accuracy: 0.4923\n",
      "Epoch 6/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0762 - accuracy: 0.5699 - val_loss: 0.0619 - val_accuracy: 0.4769\n",
      "Epoch 7/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0724 - accuracy: 0.5233 - val_loss: 0.0516 - val_accuracy: 0.4923\n",
      "Epoch 8/250\n",
      "1/1 [==============================] - 0s 19ms/step - loss: 0.0630 - accuracy: 0.5751 - val_loss: 0.0424 - val_accuracy: 0.5231\n",
      "Epoch 9/250\n",
      "1/1 [==============================] - 0s 19ms/step - loss: 0.0497 - accuracy: 0.5596 - val_loss: 0.0348 - val_accuracy: 0.6615\n",
      "Epoch 10/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0446 - accuracy: 0.5855 - val_loss: 0.0292 - val_accuracy: 0.7231\n",
      "Epoch 11/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0400 - accuracy: 0.5751 - val_loss: 0.0257 - val_accuracy: 0.7385\n",
      "Epoch 12/250\n",
      "1/1 [==============================] - 0s 19ms/step - loss: 0.0391 - accuracy: 0.6373 - val_loss: 0.0237 - val_accuracy: 0.7231\n",
      "Epoch 13/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0374 - accuracy: 0.6373 - val_loss: 0.0222 - val_accuracy: 0.6769\n",
      "Epoch 14/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0349 - accuracy: 0.6528 - val_loss: 0.0206 - val_accuracy: 0.6615\n",
      "Epoch 15/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0357 - accuracy: 0.6373 - val_loss: 0.0187 - val_accuracy: 0.6769\n",
      "Epoch 16/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0371 - accuracy: 0.6736 - val_loss: 0.0168 - val_accuracy: 0.6769\n",
      "Epoch 17/250\n",
      "1/1 [==============================] - 0s 19ms/step - loss: 0.0313 - accuracy: 0.6477 - val_loss: 0.0156 - val_accuracy: 0.6923\n",
      "Epoch 18/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0300 - accuracy: 0.6788 - val_loss: 0.0154 - val_accuracy: 0.6769\n",
      "Epoch 19/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0257 - accuracy: 0.6736 - val_loss: 0.0158 - val_accuracy: 0.6769\n",
      "Epoch 20/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0276 - accuracy: 0.7098 - val_loss: 0.0162 - val_accuracy: 0.6615\n",
      "Epoch 21/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0295 - accuracy: 0.6788 - val_loss: 0.0167 - val_accuracy: 0.6615\n",
      "Epoch 22/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0283 - accuracy: 0.6788 - val_loss: 0.0168 - val_accuracy: 0.6615\n",
      "Epoch 23/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0266 - accuracy: 0.6788 - val_loss: 0.0165 - val_accuracy: 0.6615\n",
      "Epoch 24/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0279 - accuracy: 0.6995 - val_loss: 0.0161 - val_accuracy: 0.6615\n",
      "Epoch 25/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0265 - accuracy: 0.6632 - val_loss: 0.0154 - val_accuracy: 0.6615\n",
      "Epoch 26/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0253 - accuracy: 0.6839 - val_loss: 0.0148 - val_accuracy: 0.6615\n",
      "Epoch 27/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0231 - accuracy: 0.6736 - val_loss: 0.0143 - val_accuracy: 0.6615\n",
      "Epoch 28/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0257 - accuracy: 0.6425 - val_loss: 0.0140 - val_accuracy: 0.6615\n",
      "Epoch 29/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0253 - accuracy: 0.6114 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 30/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0258 - accuracy: 0.5803 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 31/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0255 - accuracy: 0.6839 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 32/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0261 - accuracy: 0.6943 - val_loss: 0.0140 - val_accuracy: 0.6615\n",
      "Epoch 33/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0261 - accuracy: 0.6425 - val_loss: 0.0141 - val_accuracy: 0.6769\n",
      "Epoch 34/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0232 - accuracy: 0.6166 - val_loss: 0.0141 - val_accuracy: 0.6769\n",
      "Epoch 35/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0247 - accuracy: 0.5751 - val_loss: 0.0142 - val_accuracy: 0.6769\n",
      "Epoch 36/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0230 - accuracy: 0.6062 - val_loss: 0.0143 - val_accuracy: 0.6769\n",
      "Epoch 37/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0265 - accuracy: 0.5959 - val_loss: 0.0143 - val_accuracy: 0.6923\n",
      "Epoch 38/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0229 - accuracy: 0.6269 - val_loss: 0.0143 - val_accuracy: 0.6923\n",
      "Epoch 39/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0232 - accuracy: 0.6943 - val_loss: 0.0143 - val_accuracy: 0.6769\n",
      "Epoch 40/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0214 - accuracy: 0.7047 - val_loss: 0.0143 - val_accuracy: 0.6615\n",
      "Epoch 41/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0234 - accuracy: 0.6321 - val_loss: 0.0142 - val_accuracy: 0.6615\n",
      "Epoch 42/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0242 - accuracy: 0.6218 - val_loss: 0.0142 - val_accuracy: 0.6615\n",
      "Epoch 43/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0240 - accuracy: 0.6321 - val_loss: 0.0142 - val_accuracy: 0.6615\n",
      "Epoch 44/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0231 - accuracy: 0.6166 - val_loss: 0.0141 - val_accuracy: 0.6615\n",
      "Epoch 45/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0223 - accuracy: 0.6632 - val_loss: 0.0141 - val_accuracy: 0.6615\n",
      "Epoch 46/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0230 - accuracy: 0.6580 - val_loss: 0.0141 - val_accuracy: 0.6615\n",
      "Epoch 47/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0222 - accuracy: 0.6839 - val_loss: 0.0141 - val_accuracy: 0.6615\n",
      "Epoch 48/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0218 - accuracy: 0.6736 - val_loss: 0.0140 - val_accuracy: 0.6615\n",
      "Epoch 49/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0234 - accuracy: 0.6166 - val_loss: 0.0140 - val_accuracy: 0.6615\n",
      "Epoch 50/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0249 - accuracy: 0.6321 - val_loss: 0.0140 - val_accuracy: 0.6615\n",
      "Epoch 51/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0240 - accuracy: 0.6891 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 52/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0226 - accuracy: 0.6373 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 53/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0222 - accuracy: 0.6010 - val_loss: 0.0139 - val_accuracy: 0.6615\n",
      "Epoch 54/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0216 - accuracy: 0.6321 - val_loss: 0.0138 - val_accuracy: 0.6769\n",
      "Epoch 55/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0233 - accuracy: 0.6736 - val_loss: 0.0138 - val_accuracy: 0.6769\n",
      "Epoch 56/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0221 - accuracy: 0.6218 - val_loss: 0.0138 - val_accuracy: 0.6769\n",
      "Epoch 57/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0225 - accuracy: 0.6891 - val_loss: 0.0138 - val_accuracy: 0.6769\n",
      "Epoch 58/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0226 - accuracy: 0.6684 - val_loss: 0.0139 - val_accuracy: 0.6769\n",
      "Epoch 59/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0203 - accuracy: 0.6684 - val_loss: 0.0139 - val_accuracy: 0.6769\n",
      "Epoch 60/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0233 - accuracy: 0.7254 - val_loss: 0.0139 - val_accuracy: 0.6769\n",
      "Epoch 61/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0223 - accuracy: 0.6477 - val_loss: 0.0139 - val_accuracy: 0.6769\n",
      "Epoch 62/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0216 - accuracy: 0.6580 - val_loss: 0.0140 - val_accuracy: 0.6923\n",
      "Epoch 63/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0228 - accuracy: 0.6684 - val_loss: 0.0140 - val_accuracy: 0.6923\n",
      "Epoch 64/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0227 - accuracy: 0.6684 - val_loss: 0.0140 - val_accuracy: 0.6923\n",
      "Epoch 65/250\n",
      "1/1 [==============================] - 0s 20ms/step - loss: 0.0207 - accuracy: 0.6218 - val_loss: 0.0140 - val_accuracy: 0.6923\n",
      "Epoch 66/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0220 - accuracy: 0.6632 - val_loss: 0.0139 - val_accuracy: 0.6923\n",
      "Epoch 67/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0198 - accuracy: 0.6839 - val_loss: 0.0139 - val_accuracy: 0.6923\n",
      "Epoch 68/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0223 - accuracy: 0.6425 - val_loss: 0.0138 - val_accuracy: 0.6923\n",
      "Epoch 69/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0221 - accuracy: 0.6632 - val_loss: 0.0138 - val_accuracy: 0.6923\n",
      "Epoch 70/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0225 - accuracy: 0.6477 - val_loss: 0.0138 - val_accuracy: 0.7077\n",
      "Epoch 71/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0203 - accuracy: 0.7047 - val_loss: 0.0137 - val_accuracy: 0.7077\n",
      "Epoch 72/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0213 - accuracy: 0.7202 - val_loss: 0.0136 - val_accuracy: 0.7077\n",
      "Epoch 73/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0236 - accuracy: 0.6839 - val_loss: 0.0136 - val_accuracy: 0.7077\n",
      "Epoch 74/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0203 - accuracy: 0.6528 - val_loss: 0.0135 - val_accuracy: 0.7077\n",
      "Epoch 75/250\n",
      "1/1 [==============================] - 0s 31ms/step - loss: 0.0207 - accuracy: 0.6632 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 76/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0209 - accuracy: 0.6995 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 77/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0194 - accuracy: 0.6891 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 78/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0227 - accuracy: 0.6839 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 79/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0247 - accuracy: 0.7202 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 80/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0226 - accuracy: 0.6891 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 81/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0230 - accuracy: 0.6788 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 82/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0226 - accuracy: 0.6943 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 83/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0209 - accuracy: 0.6580 - val_loss: 0.0136 - val_accuracy: 0.7385\n",
      "Epoch 84/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0192 - accuracy: 0.7047 - val_loss: 0.0136 - val_accuracy: 0.7385\n",
      "Epoch 85/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0213 - accuracy: 0.6684 - val_loss: 0.0137 - val_accuracy: 0.7538\n",
      "Epoch 86/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0196 - accuracy: 0.6736 - val_loss: 0.0137 - val_accuracy: 0.7385\n",
      "Epoch 87/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0206 - accuracy: 0.7565 - val_loss: 0.0137 - val_accuracy: 0.7385\n",
      "Epoch 88/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0194 - accuracy: 0.6736 - val_loss: 0.0137 - val_accuracy: 0.7385\n",
      "Epoch 89/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0199 - accuracy: 0.6995 - val_loss: 0.0137 - val_accuracy: 0.7538\n",
      "Epoch 90/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0232 - accuracy: 0.7306 - val_loss: 0.0136 - val_accuracy: 0.7385\n",
      "Epoch 91/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0222 - accuracy: 0.7098 - val_loss: 0.0136 - val_accuracy: 0.7385\n",
      "Epoch 92/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0217 - accuracy: 0.7150 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 93/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0210 - accuracy: 0.7358 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 94/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0209 - accuracy: 0.7565 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 95/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0228 - accuracy: 0.7202 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 96/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0205 - accuracy: 0.7150 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 97/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0212 - accuracy: 0.7098 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 98/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0186 - accuracy: 0.7150 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 99/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0198 - accuracy: 0.7047 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 100/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0191 - accuracy: 0.7202 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 101/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0185 - accuracy: 0.6736 - val_loss: 0.0136 - val_accuracy: 0.7692\n",
      "Epoch 102/250\n",
      "1/1 [==============================] - 0s 36ms/step - loss: 0.0199 - accuracy: 0.6736 - val_loss: 0.0135 - val_accuracy: 0.7692\n",
      "Epoch 103/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0204 - accuracy: 0.7098 - val_loss: 0.0135 - val_accuracy: 0.7692\n",
      "Epoch 104/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0190 - accuracy: 0.7202 - val_loss: 0.0135 - val_accuracy: 0.7692\n",
      "Epoch 105/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0189 - accuracy: 0.6839 - val_loss: 0.0135 - val_accuracy: 0.7692\n",
      "Epoch 106/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0200 - accuracy: 0.7461 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 107/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0216 - accuracy: 0.6891 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 108/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0195 - accuracy: 0.7202 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 109/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0180 - accuracy: 0.7358 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 110/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0204 - accuracy: 0.7565 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 111/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0194 - accuracy: 0.6736 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 112/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0224 - accuracy: 0.6684 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 113/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0193 - accuracy: 0.7202 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 114/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0184 - accuracy: 0.7306 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 115/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0205 - accuracy: 0.6839 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 116/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0200 - accuracy: 0.7254 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 117/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0198 - accuracy: 0.6943 - val_loss: 0.0134 - val_accuracy: 0.7231\n",
      "Epoch 118/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0192 - accuracy: 0.7668 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 119/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0203 - accuracy: 0.7461 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 120/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0175 - accuracy: 0.7409 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 121/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0208 - accuracy: 0.6995 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 122/250\n",
      "1/1 [==============================] - 0s 34ms/step - loss: 0.0217 - accuracy: 0.7098 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 123/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0186 - accuracy: 0.6995 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 124/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0199 - accuracy: 0.7461 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 125/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0187 - accuracy: 0.7720 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 126/250\n",
      "1/1 [==============================] - 0s 31ms/step - loss: 0.0175 - accuracy: 0.7306 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 127/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0197 - accuracy: 0.6995 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 128/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0192 - accuracy: 0.6632 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 129/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0187 - accuracy: 0.7047 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 130/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0196 - accuracy: 0.6943 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 131/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0223 - accuracy: 0.6891 - val_loss: 0.0132 - val_accuracy: 0.7538\n",
      "Epoch 132/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0205 - accuracy: 0.7150 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 133/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0187 - accuracy: 0.7150 - val_loss: 0.0131 - val_accuracy: 0.7231\n",
      "Epoch 134/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0188 - accuracy: 0.6891 - val_loss: 0.0131 - val_accuracy: 0.7538\n",
      "Epoch 135/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0198 - accuracy: 0.7409 - val_loss: 0.0131 - val_accuracy: 0.7385\n",
      "Epoch 136/250\n",
      "1/1 [==============================] - 0s 29ms/step - loss: 0.0182 - accuracy: 0.7202 - val_loss: 0.0131 - val_accuracy: 0.7231\n",
      "Epoch 137/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0181 - accuracy: 0.6995 - val_loss: 0.0131 - val_accuracy: 0.7385\n",
      "Epoch 138/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0188 - accuracy: 0.7150 - val_loss: 0.0131 - val_accuracy: 0.7231\n",
      "Epoch 139/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0185 - accuracy: 0.6684 - val_loss: 0.0131 - val_accuracy: 0.7385\n",
      "Epoch 140/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0182 - accuracy: 0.7150 - val_loss: 0.0131 - val_accuracy: 0.7385\n",
      "Epoch 141/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0194 - accuracy: 0.6736 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 142/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0186 - accuracy: 0.7668 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 143/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0179 - accuracy: 0.7461 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 144/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0185 - accuracy: 0.7047 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 145/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0188 - accuracy: 0.7513 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 146/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0198 - accuracy: 0.7409 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 147/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0184 - accuracy: 0.7254 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 148/250\n",
      "1/1 [==============================] - 0s 31ms/step - loss: 0.0173 - accuracy: 0.7565 - val_loss: 0.0133 - val_accuracy: 0.7231\n",
      "Epoch 149/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0214 - accuracy: 0.6943 - val_loss: 0.0132 - val_accuracy: 0.7231\n",
      "Epoch 150/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0210 - accuracy: 0.7617 - val_loss: 0.0132 - val_accuracy: 0.7538\n",
      "Epoch 151/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0197 - accuracy: 0.6788 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 152/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0180 - accuracy: 0.7254 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 153/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0184 - accuracy: 0.7513 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 154/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0203 - accuracy: 0.7306 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 155/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0188 - accuracy: 0.7461 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 156/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0175 - accuracy: 0.7513 - val_loss: 0.0132 - val_accuracy: 0.7385\n",
      "Epoch 157/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0173 - accuracy: 0.7824 - val_loss: 0.0132 - val_accuracy: 0.7692\n",
      "Epoch 158/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0203 - accuracy: 0.7202 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 159/250\n",
      "1/1 [==============================] - 0s 30ms/step - loss: 0.0192 - accuracy: 0.7461 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 160/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0185 - accuracy: 0.7306 - val_loss: 0.0133 - val_accuracy: 0.7692\n",
      "Epoch 161/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0176 - accuracy: 0.7927 - val_loss: 0.0134 - val_accuracy: 0.7692\n",
      "Epoch 162/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0176 - accuracy: 0.7254 - val_loss: 0.0134 - val_accuracy: 0.7692\n",
      "Epoch 163/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0174 - accuracy: 0.7565 - val_loss: 0.0134 - val_accuracy: 0.7692\n",
      "Epoch 164/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0172 - accuracy: 0.7409 - val_loss: 0.0134 - val_accuracy: 0.7692\n",
      "Epoch 165/250\n",
      "1/1 [==============================] - 0s 31ms/step - loss: 0.0173 - accuracy: 0.7150 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 166/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0195 - accuracy: 0.7202 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 167/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0171 - accuracy: 0.7513 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 168/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0196 - accuracy: 0.7150 - val_loss: 0.0134 - val_accuracy: 0.7385\n",
      "Epoch 169/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0178 - accuracy: 0.7927 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 170/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0156 - accuracy: 0.7150 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 171/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0201 - accuracy: 0.7047 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 172/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0173 - accuracy: 0.7098 - val_loss: 0.0136 - val_accuracy: 0.7538\n",
      "Epoch 173/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0175 - accuracy: 0.6943 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 174/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0193 - accuracy: 0.7254 - val_loss: 0.0135 - val_accuracy: 0.7385\n",
      "Epoch 175/250\n",
      "1/1 [==============================] - 0s 23ms/step - loss: 0.0210 - accuracy: 0.7720 - val_loss: 0.0135 - val_accuracy: 0.7538\n",
      "Epoch 176/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0155 - accuracy: 0.7306 - val_loss: 0.0135 - val_accuracy: 0.7692\n",
      "Epoch 177/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0182 - accuracy: 0.7098 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 178/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0177 - accuracy: 0.7409 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 179/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0175 - accuracy: 0.7409 - val_loss: 0.0134 - val_accuracy: 0.7538\n",
      "Epoch 180/250\n",
      "1/1 [==============================] - 0s 25ms/step - loss: 0.0174 - accuracy: 0.7358 - val_loss: 0.0134 - val_accuracy: 0.7692\n",
      "Epoch 181/250\n",
      "1/1 [==============================] - 0s 26ms/step - loss: 0.0166 - accuracy: 0.7461 - val_loss: 0.0133 - val_accuracy: 0.7692\n",
      "Epoch 182/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0151 - accuracy: 0.6995 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "Epoch 183/250\n",
      "1/1 [==============================] - 0s 27ms/step - loss: 0.0186 - accuracy: 0.7461 - val_loss: 0.0132 - val_accuracy: 0.7692\n",
      "Epoch 184/250\n",
      "1/1 [==============================] - 0s 28ms/step - loss: 0.0187 - accuracy: 0.8031 - val_loss: 0.0132 - val_accuracy: 0.7538\n",
      "Epoch 185/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0194 - accuracy: 0.7254 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 186/250\n",
      "1/1 [==============================] - 0s 22ms/step - loss: 0.0186 - accuracy: 0.7617 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 187/250\n",
      "1/1 [==============================] - 0s 24ms/step - loss: 0.0149 - accuracy: 0.7409 - val_loss: 0.0133 - val_accuracy: 0.7385\n",
      "Epoch 188/250\n",
      "1/1 [==============================] - 0s 21ms/step - loss: 0.0181 - accuracy: 0.7202 - val_loss: 0.0133 - val_accuracy: 0.7538\n",
      "[Model] Training Completed. Model saved as saved_models\\COVID19_LSTM.h5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "64/64 [==============================] - 0s 218us/step\n",
      "test loss, test acc: [0.016533854883164167, 0.734375]\n"
     ]
    }
   ],
   "source": [
    "nfeatures = X_data.shape[2]\n",
    "model = aLSTM(time_step, nfeatures=nfeatures)\n",
    "print('[Model] Training Started')\n",
    "print('[Model] %s epochs, %s batch size' % (epochs, batch_size))\n",
    "\n",
    "# model.load_weights(save_fname)\n",
    "callbacks = [\n",
    "    EarlyStopping(monitor='val_loss', patience=50),\n",
    "    ModelCheckpoint(filepath=save_fname, monitor='val_loss', save_best_only=True),\n",
    "#     TensorBoard(log_dir='./logs')\n",
    "]\n",
    "history = model.fit(x=X_train,y=Y_train, \n",
    "                    validation_data=(X_val,Y_val),\n",
    "                    validation_steps=1,\n",
    "                    callbacks=callbacks,steps_per_epoch=1,epochs=epochs,verbose=1)\n",
    "model.save(save_fname)\n",
    "print('[Model] Training Completed. Model saved as %s' % save_fname)\n",
    "printFigure(history)\n",
    "\n",
    "# Performance in test data\n",
    "results = model.evaluate(X_test, Y_test)\n",
    "print('test loss, test acc:', results)\n",
    "# show mutil-plots\n",
    "if is_single_country :\n",
    "    # Only plot figures when there is one coutry in data set. \n",
    "    Confirmed_train, Fatalities_train = plotTrainFigure(model, X_trainAndVal, Y_trainAndVal, X_test, Y_test, \n",
    "                                                    dates, trainAndValDates, testDates, scb, time_step=time_step, country=country,daily=daily)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
